////四种类型计算的规则
//#include <iostream>
//#include <typeinfo>
//using namespace std;
//
//double foo();//有无函数体没什么关系
//
//int main(void) {
//	int a = 10;
//	//如果给decltype传递的是标识符表达式，则编译器根据标识符的类型，作为最终计算出的类型
//	decltype(a) c = a;
//	cout << "c的类型：" << typeid(c).name() << endl;
//	cout << "&c:" << &c << ",&a" << &a << endl;
//
//	//如果给decltype传递的是函数表达式，则编译器根据函数的返回值的类型，作为最终计算出的类型
//	decltype(foo()) d = a;
//	//d: double
//	cout << "d的类型：" << typeid(d).name() << endl;//d
//	cout << "&d:" << &c << ",&a" << &a << endl;//地址不同
//	d++;//允许更改
//
//	//如果是其它表达式，并且表达式结果为左值，则编译器取该左值引用的类型，作为最终计算结果的类型
//	decltype(++a) e = a;
//	//e:int&
//	cout << "e的类型：" << typeid(e).name() << endl;//i
//	cout << "&e:" << &e << ",&a" << &a << endl;//地址相同
//	e++;//允许更改
//
//	//如果说是其它表达式，并且表达式结果为右值，则编译器取该右值本身的类型，作为最终计算出的类型
//
//	decltype(a++) f = a;
//	//e:int 
//	cout << "f的类型：" << typeid(f).name() << endl;//i
//	cout << "&f:" << &f << ",&a" << &a << endl;//地址不同
//	f++;//允许更改
//	return 0;
//}